<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_Group
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy encyjnej Auction.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 */
class Application_Model_GroupMapper
{
    protected $_dbTable; /*!<  Klasa tabeli */

    /**
     * @brief @brief Metoda do ustawiania klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_GroupMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }
    
    /**
     * @brief Metoda zwracająca klasę tabel.
     * 
     * @return Application_Model_DbTable_Group
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_Group');
        }

        return $this->_dbTable;
    }

    /**
     * @brief Metoda zapisująca grupe w bazie
     * 
     * @return int identyfiaktor grupy
     */
    public function save(Application_Model_Group $group) { 

        $data = array(
            
            'MarketEntity_id'   =>  $group->getMarketEntity_id(),
            'multipler'         =>  $group->getMultipler(),
            'isMandatory'       =>  $group->getIsMandatory(),
            'headOffer_id'      =>  $group->getHeadOffer_id(),
            
        );



        if (null === ($id = $group->getGroup_id())) { 

            unset($data['Group_id']);

            $newId = $this->getDbTable()->insert($data);
            return $newId;
        } else {

            $this->getDbTable()->update($data, array('Group_id = ?' => $id)); 
            return $id;
        }
        
        
    }
    
    /**
     * @brief Metoda wyszukująca w bazie okresloną grupę
     * 
     */
    public function find($id) { 
        
        $group = new Application_Model_Group();    
        $result = $this->getDbTable()->find($id);

        if (0 == count($result)) {

            return;
        }

        $row = $result->current();
        
        $group->setIsMandatory($row->isMandatory);
        $group->setMultipler($row->multipler);
        $group->setHeadOffer_id($row->headOffer_id);
        $group->setMarketEntity_id($row->MarketEntity_id);
        $group->setGroup_id($row->Group_id);
        
        
        return $group;

    }
    
    /**
     * @brief Metoda wyszukująca w bazie danych wszystkie grupy o określonych parametrach
     * 
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query);
                    //->order('endTime');

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }
    
    /**
     * @brief Metoda przetwarzająca dane z bazy danych
     * 
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $group = new Application_Model_Group();

            $group->setIsMandatory($row->isMandatory);
            $group->setMultipler($row->multipler);
            $group->setHeadOffer_id($row->headOffer_id);
            $group->setMarketEntity_id($row->MarketEntity_id);
            $group->setGroup_id($row->Group_id);

            $entries[] = $group;
        }
        return $entries;
    }

    /**
     * @brief Metoda wyszukująca w bazie danych wszystkie grupy przyanlezne do danej grupy
     * 
     */
    public function fetchByOfferId($offerId) {
                      
        $db = Zend_Db_Table::getDefaultAdapter();
        $select = $db->select();
        $select->from(array('g'=>'group'));
        $select->join(array('o'=>'offer_has_group'),'o.Group_id = g.Group_id');
        $select->where('o.Offer_id = ?',$offerId);
       
        //throw new Exception('tu jestem'); 
       $results = array();
       $resultSet = $db->fetchAll($select);
       foreach ($resultSet as $key=>$value) {
            $results[] = new Application_Model_Group($value);
       }
       return $results;
    }
    
    /**
     * @brief Metoda usuwająca grupę o określonym id;
     * 
     */
    public function delete($groupId){
        $query = 'Group_id = '.$groupId;
        $this->getDbTable()->delete($query);
    }
    
}

